/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

/**
 *
 * @author Facundo
 */
import Logica.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;

public class ADOUsuario {

    private Singleton_Conexion datosconexion;
    Connection conexion;

    public ADOUsuario() {
        try {
            Class.forName(datosconexion.getInstancia().getDriver());
            conexion = DriverManager.getConnection(datosconexion.getInstancia().getProtocolo());
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
        }
    }

    public boolean insertarUsuario(Usuario a) {
        String sentencia = "Insert Into usuario (nombre_usuario,nombre_rol,habilitado) values(?,?,?)";
        PreparedStatement st;
        try {
            st = conexion.prepareStatement(sentencia);
            st.setString(1, a.getNombreUsuario());
            st.setString(2, a.getRol());
            if (a.isHabilitado()) {
                st.setInt(3, 1);
            } else {
                st.setInt(3, 0);
            }
            st.execute();
            st.close();
            return true;
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
            return false;
        }
    }
    /*
     * trae solo los nombres de usuarios para cargar el combox de usuarios
     * recibe como parametro el proyecto seleccionado
     */

    /*
     * Igual que el anterior pero sin parameto sirve para ver la disponibildiad
     * del nombre de usr y para poder mostrarlos todos en el IUsuarios
     *
     */
    public LinkedList traerSoloUsuarios() {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        try {
            PreparedStatement st;
            String sentencia = "select * from usuario ";
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();
            while (rs.next()) {
                Usuario usr = new Usuario();
                usr.setNombreUsuario(rs.getString("nombre_usuario"));
                usr.setRol(rs.getString("nombre_rol"));
                usr.setHabilitado(rs.getBoolean("habilitado"));
                lista.add(usr);
            }
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return lista;
    }
       public LinkedList traerSoloUsuariosHabilitados() {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        try {
            PreparedStatement st;
            String sentencia = "select * from usuario where habilitado = 1";
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();
            while (rs.next()) {
                Usuario usr = new Usuario();
                usr.setNombreUsuario(rs.getString("nombre_usuario"));
                usr.setRol(rs.getString("nombre_rol"));
                usr.setHabilitado(rs.getBoolean("habilitado"));
                lista.add(usr);
            }
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return lista;
    }
    //Para el inicio de sesión. Me fijo en la base de datos si existe un usuario con el nombre de usuario y password ingresados.
    //Si existe el usuario lo materializo y lo devuelvo.
    public Usuario buscarUsuario(String nombreUsuario) {
        ResultSet rs;
        PreparedStatement st;
        try {
            st = conexion.prepareStatement("select * from usuario where nombre_usuario = '" + nombreUsuario + "'");
            rs = st.executeQuery();
            if (rs.next()) {
                //Acá creo un nuevo objeto usuario para devolver, le seteo todo menos el password para más seguridad.
                String nomUsuario = rs.getString("nombre_usuario");
                String rol = rs.getString("nombre_rol");
                boolean habilitado = rs.getBoolean("habilitado");
                rs.close();
                return new Usuario(nomUsuario, rol, habilitado);
            } else {
                rs.close();
                return null;
            }
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return null;
    }

    /*
     * este metodo es para traer el usuario, y asi agregarlo a una clase accion
     */
    public Usuario buscarUsuarioPorId(String nombreUsuario) {
        ResultSet rs;
        PreparedStatement st;
        try {
            st = conexion.prepareStatement("select * from usuario where nombre_usuario = ?");
            st.setString(1, nombreUsuario);

            rs = st.executeQuery();
            if (rs.next()) {
                //Acá creo un nuevo objeto usuario para devolver
                String nomUsuario = rs.getString("nombre_usuario");
                String rol = rs.getString("nombre_rol");
                boolean habilitado = rs.getBoolean("habilitado");
                rs.close();
                return new Usuario(nomUsuario, rol, habilitado);
            } else {
                rs.close();
                return null;
            }
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return null;
    }

    public LinkedList traerUsuariosPorProyecto(String nombreProyecto) {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        try {
            PreparedStatement st;
            String sentencia = "select distinct u.* from proyecto p, usuario u, usuariosxproyecto uxp "
                    + "where uxp.nombre_proyecto='" + nombreProyecto + "'and u.nombre_usuario=uxp.nombre_usuario";
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();
            while (rs.next()) {
                Usuario usr = new Usuario();
                usr.setNombreUsuario(rs.getString("nombre_usuario"));
                usr.setHabilitado(rs.getBoolean("habilitado"));
                usr.setRol(rs.getString("nombre_rol"));
                lista.add(usr);
            }
            st.close();
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return lista;


    }

    //Este método deshabilita un usuario en la BD apartir de la referencia al onjeto Usuario pasada por parámetro
    public boolean deshabilitarUsuario(Usuario u) {
        String sentencia = "update usuario set nombre_rol=?, habilitado=? where nombre_usuario=?";
        PreparedStatement st;
        try {
            st = conexion.prepareStatement(sentencia);
            st.setString(1, u.getRol());
            //Pongo el campo habilitado como falso
            st.setBoolean(2, false);
            st.setString(3, u.getNombreUsuario());
            st.execute();
            st.close();
            return true;
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
            return false;
        }
    }
    
    public LinkedList traerUsuariosPorProyectoHabilitados(String nombreProyecto) {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        try {
            PreparedStatement st;
            String sentencia = "select distinct u.* from proyecto p, usuario u, usuariosxproyecto uxp "
                    + "where uxp.nombre_proyecto='" + nombreProyecto + "' and u.nombre_usuario=uxp.nombre_usuario"
                    + " and u.habilitado = 1";
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();
            while (rs.next()) {
                Usuario usr = new Usuario();
                usr.setNombreUsuario(rs.getString("nombre_usuario"));
                usr.setHabilitado(rs.getBoolean("habilitado"));
                usr.setRol(rs.getString("nombre_rol"));
                lista.add(usr);
            }
            st.close();
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }
        return lista;
    }
    
}
